From b52db73f59dc72dd81a01a323893a738303a775d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 31 Jan 2011 19:35:51 -0500 Subject: [PATCH] Deal gracefully with unowned selections If a selection looses its owner without a replacement, owner is None, which we did not handle very well. https://bugzilla.gnome.org/show_bug.cgi?id=641042 --- gdk/gdkevents.c | 7 +++++-- gdk/gdkevents.h | 14 +++++++------- gdk/x11/gdkdisplay-x11.c | 7 +++++-- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index 66a14ec924..cf603492aa 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -568,7 +568,9 @@ gdk_event_copy (const GdkEvent *event) break; case GDK_OWNER_CHANGE: - new_event->owner_change.owner = g_object_ref (event->owner_change.owner); + new_event->owner_change.owner = event->owner_change.owner; + if (new_event->owner_change.owner) + g_object_ref (new_event->owner_change.owner); break; default: @@ -641,7 +643,8 @@ gdk_event_free (GdkEvent *event) break; case GDK_OWNER_CHANGE: - g_object_unref (event->owner_change.owner); + if (event->owner_change.owner) + g_object_unref (event->owner_change.owner); break; default: diff --git a/gdk/gdkevents.h b/gdk/gdkevents.h index 4902601e3c..91a5c8e0a7 100644 --- a/gdk/gdkevents.h +++ b/gdk/gdkevents.h @@ -819,15 +819,15 @@ struct _GdkEventSelection /** * GdkEventOwnerChange: * @type: the type of the event (%GDK_OWNER_CHANGE). - * @window: the window which received the event. + * @window: the window which received the event * @send_event: %TRUE if the event was sent explicitly (e.g. using - * XSendEvent). - * @owner: the new owner of the selection. - * @reason: the reason for the ownership change as a #GdkOwnerChange value. - * @selection: the atom identifying the selection. - * @time: the timestamp of the event. + * XSendEvent) + * @owner: the new owner of the selection, or %NULL if there is none + * @reason: the reason for the ownership change as a #GdkOwnerChange value + * @selection: the atom identifying the selection + * @time: the timestamp of the event * @selection_time: the time at which the selection ownership was taken - * over. + * over * * Generated when the owner of a selection changes. On X11, this * information is only available if the X server supports the XFIXES diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index 20735ccf6f..23dd5677f1 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -919,8 +919,11 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator, event->owner_change.type = GDK_OWNER_CHANGE; event->owner_change.window = window; - event->owner_change.owner = gdk_x11_window_foreign_new_for_display (display, - selection_notify->owner); + if (selection_notify->owner != None) + event->owner_change.owner = gdk_x11_window_foreign_new_for_display (display, + selection_notify->owner); + else + event->owner_change.owner = NULL; event->owner_change.reason = selection_notify->subtype; event->owner_change.selection = gdk_x11_xatom_to_atom_for_display (display, -- 2.30.2